#include "linkedlist.h"

llno* novo_no(void)
{
    llno* n = (llno*)malloc(sizeof(llno));
    if (n) memset(n,0,sizeof(llno));
    return(n);
}

void linkedlist_init(linkedlist *l, notipo t)
{
    if (!l) return;
    l->inicio = NULL;
    l->fim = NULL;
    l->tipo = t;
    l->tamanho = 0;
}

void linkedlist_clear(linkedlist *l)
{
    if (!l) return;
    while(l->inicio)
    {
        l->fim = l->inicio;
        l->inicio = l->inicio->prox;
        switch (l->tipo)
        {
        case NO_STRING:
        {
            free(l->fim->valor.s);
            break;
        }
        case NO_ARGS:
        {
            argumentos_del(l->fim->valor.a);
            break;
        }
        }
        free(l->fim);
    }
    l->fim = NULL;
    l->tamanho = 0;
}

void linkedlist_push(linkedlist *l, llno *n)
{
    if (!l || !n) return;
    if (l->inicio)
    {
        n->prox = l->inicio;
        l->inicio = n;
    }
    else
    {
        l->inicio = n;
        l->fim = n;
    }
    l->tamanho++;
}

void linkedlist_push_string(linkedlist *l, char* s)
{
    if (!l || (l->tipo != NO_STRING)) return;
    llno* n = novo_no();
    if (!n) return;
    n->valor.s = s;
    linkedlist_push(l,n);
}

void linkedlist_push_args(linkedlist *l, argumentos a)
{
    if (!l || (l->tipo != NO_ARGS)) return;
    llno* n = novo_no();
    if (!n) return;
    n->valor.a = a;
    linkedlist_push(l,n);
}
